/**
 * Copyright 2012 João Paulo Macedo da Silva
 * 
 * Este arquivo é parte do programa siri-musical
 * 
 * siri-musical é um software livre; você pode redistribui-lo e/ou 
 * modifica-lo dentro dos termos da Licença Pública Geral GNU como 
 * publicada pela Fundação do Software Livre (FSF); na versão 3 da 
 * Licença.
 * 
 * Este programa é distribuido na esperança que possa ser util, 
 * mas SEM NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer
 * MERCADO ou APLICAÇÃO EM PARTICULAR.
 * Veja a Licença Pública Geral GNU para maiores detalhes.
 * 
 * Você deve ter recebido uma cópia da Licença Pública Geral GNU
 * junto com este programa, se não, escreva para a Fundação do Software
 * Livre(FSF) Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

package Unique;

import java.util.Random;

/**
 * Classe com funções para trabalhar com as notas musicais como
 * pegar uma nota aleatória.
 * 
 * Os valores inteiros usados são tons para o "Manager.playTone",
 * para detalhes visite: http://developers.sun.com/mobility/midp/articles/mmapioverview/index.html
 * 
 * @author João Paulo Macedo da Silva <jpaulog12@yahoo.com.br>
 */
public class Notes {
    private static String[][] noteList = new String[][]{
        {"Dó", ",048,060,072,084,096"}, {"Dó#", ",049,061,073,085,097"},
        {"Ré", ",050,062,074,086,098"}, {"Ré#", ",039,051,063,075,087,099"},
        {"Mi", ",052,064,076,088,100"},
        {"Fá", ",053,065,077,089,101"}, {"Fá#", ",054,066,078,090,102"},
        {"Sol", ",055,067,079,091,103"}, {"Sol#", ",056,068,080,092,104"},
        {"Lá", ",057,069,081,093,105"}, {"Lá#", ",058,070,082,094,106"},
        {"Si", ",059,071,083,095,107"}};
    
    /**
     * Verifica se o tom pertence a nota.
     * @param note Recebe uma string contendo a nota,
     *              não é sensitive case (aceita "Dó", "Dó#", "dó", "DÓ"...).
     * @param tone Recebe um inteiro contendo o tomr nota.
     * @return Retorna TRUE em caso de pertencer.
     */
    public static boolean isNote(String note, int tone) {
        int ind = getIndNote(note);
        String trueNote = ((tone <= 99)? ",0": ",") + Integer.toString(tone);
        if (ind != -1)
            return noteList[ind][1].indexOf( trueNote ) != -1;

        return false;
    }
    
    /**
     * Retorna uma nota aleatória.
     * @return Retorna um inteiro contendo o tom da nota.
     */
    public static int getRandomNote() {
        Random r = new Random();
        int ind = r.nextInt(noteList.length -1);
        int pos = (r.nextInt(4) * 4) +1;
        int tam = pos+3;//
        String num = noteList[ind][1].substring(pos, tam);
        return Integer.valueOf(num).intValue();
    }
    
    /**
     * Retorna uma nota aleatória a partir de notas pré-selecionadas.
     * @param notes Recebe um array de Strings com as notas a serem sorteadas.
     * @return Retorna um inteiro contendo o tom da nota.
     */
    public static int getRandomNote(String[] notes) {
        if ( (notes == null) || (notes.length == 0) )
            return getRandomNote();
        
        Random r = new Random();
        
        //Verificar se a nota é válida
        String Note = notes[r.nextInt(notes.length -1)];
        int ind = getIndNote(Note);
        if (ind == -1)
            return getRandomNote();
        
        //retornar nota aleatória
        int pos = (r.nextInt(4) * 4) +1;
        int tam = pos+3;
        String num = noteList[ind][1].substring(pos, tam);
        return Integer.valueOf(num).intValue();
    }
    
    /**
     * Retorna o índice da nota no vetor noteList.
     * @param note Recebe uma String contendo a nota ("Dó", "Ré#", ...).
     * @return Retorna o índice da nota no vetor noteList,
     *          caso não encontre retorna -1.
     */
    private static int getIndNote(String note) {
        for (int i = 0; i < noteList.length; i++)
            if (noteList[i][0].toUpperCase().equals( note.toUpperCase() ))
                return i;
        
        return -1;
    }
    
    /**
     * Retorna a nota que contém o tom passado.
     * @param note Recebe um inteiro contendo o tom a ser pesquisado.
     * @return Retorna uma String contendo a nota, no caso de não existir
     *          retorna "".
     */
    public static String getNote(int note) {
        for (int i = 0; i < noteList.length; i++)
            if (isNote(noteList[i][0], note))
                return noteList[i][0];
        
        return "";
    }
    
    /**
     * Retorna as notas.
     * @return Retorna um array de String contendo o nome das notas.
     */
    public static String[] getNotes() {
        String[] notes = new String[noteList.length];
        for (int i = 0 ; i < noteList.length; i++)
            notes[i] = noteList[i][0];
        
        return notes;
    }
}
